// Package datatypes
// @Author zhongxc
// @Date 2024/7/9 15:59:00
// @Desc
package datatypes

import (
	"database/sql/driver"
	"fmt"
	"strings"
	"time"
)

const timeFormat = "2006-01-02 15:04:05" // 将时间格式定义为常量

type Time time.Time

func (t *Time) UnmarshalJSON(data []byte) error {
	if string(data) == "null" {
		return nil
	}
	var err error
	// 前端接收的时间字符串
	str := string(data)
	// 去除接收的str结尾多余的"
	timeStr := strings.Trim(str, "\"")
	t1, err := time.Parse(time.DateTime, timeStr)
	*t = Time(t1)
	if err != nil {
		return fmt.Errorf("解析时间失败, 原始字符串: %s, 错误: %w", timeStr, err) // 提供错误上下文
	}
	return nil
}

func (t Time) MarshalJSON() ([]byte, error) {
	formatted := fmt.Sprintf("\"%v\"", time.Time(t).Format(time.DateTime))
	return []byte(formatted), nil
}

func (t Time) Value() (driver.Value, error) {
	// MyTime 转换成 time.Time 类型
	tTime := time.Time(t)
	return tTime.Format(time.DateTime), nil
}

func (t *Time) Scan(v interface{}) error {
	switch vt := v.(type) {
	case time.Time:
		*t = Time(vt)
	default:
		return fmt.Errorf("类型错误: 期望 time.Time, 实际: %T", v) // 提供更详细的错误信息
	}
	return nil
}

func (t *Time) String() string {
	// 如果"hhh:"部分有特殊含义，请在方法注释中说明
	// return fmt.Sprintf("hhh:%s", time.Time(*t).String())
	return fmt.Sprintf("%v", time.Time(*t).Format(time.DateTime))
}
